home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
edit
/
xvisrc.zip
/
NORMAL.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-07-28
|
42KB
|
1,821 lines
/* Copyright (c) 1990,1991,1992 Chris and John Downey */
#ifndef lint
static char *sccsid = "@(#)normal.c 2.7 (Chris & John Downey) 8/24/92";
#endif
/***
* program name:
xvi
* function:
PD version of UNIX "vi" editor, with extensions.
* module name:
normal.c
* module function:
Main routine for processing characters in command mode
as well as routines for handling the operators.
* history:
STEVIE - ST Editor for VI Enthusiasts, Version 3.10
Originally by Tim Thompson (twitch!tjt)
Extensive modifications by Tony Andrews (onecom!wldrdg!tony)
Heavily modified by Chris & John Downey
***/
#include "xvi.h"
static bool_t do_target P((int, int));
static bool_t do_cmd P((int, int));
static bool_t do_badcmd P((int, int));
static bool_t do_page P((int, int));
static bool_t do_scroll P((int, int));
static bool_t do_word P((int, int));
static bool_t do_csearch P((int, int));
static bool_t do_z P((int, int));
static bool_t do_x P((int, int));
static bool_t do_HLM P((int, int));
static bool_t do_rchar P((int, int));
static bool_t do_ins P((int, int));
static void op_shift P((int, int, int, long, Posn *, Posn *));
static void op_delete P((int, int, long, Posn *, Posn *));
static void op_change P((int, int, long, Posn *, Posn *));
static void op_yank P((Posn *, Posn *));
static bool_t dojoin P((void));
/*
* Command type table. This is used for certain operations which are
* the same for "classes" of commands, e.g. for disallowing their use
* as targets of operators.
*
* Entries in this table having value 0 are unimplemented commands.
*
* If TARGET is set, the command may be used as the target for one of
* the operators (e.g. 'c'); the default is that targets are character-
* based unless TGT_LINE is set in which case they are line-based.
* Similarly, the default is that targets are exclusive, unless the
* TGT_INCLUSIVE flag is set.
*
* Q: WHAT DO WE DO ABOUT RETURN and LINEFEED???
* A: The ascii_map() macro (see ascii.h) handles this for QNX (I think).
*/
#define COMMAND 0x1 /* is implemented */
#define TARGET 0x2 /* can serve as a target */
#define TGT_LINE 0x4 /* a line-based target */
#define TGT_CHAR 0 /* a char-based target */
#define TGT_INCLUSIVE 0x8 /* an inclusive target */
#define TGT_EXCLUSIVE 0 /* an exclusive target */
#define TWO_CHAR 0x10 /* a two-character command */
static struct {
bool_t (*c_func) P((int, int));
unsigned char c_flags;
} cmd_types[256] = {
/* ^@ */ do_badcmd, 0,
/* ^A */ do_badcmd, 0,
/* ^B */ do_page, COMMAND,
/* ^C */ do_badcmd, 0,
/* ^D */ do_scroll, COMMAND,
/* ^E */ do_scroll, COMMAND,
/* ^F */ do_page, COMMAND,
/* ^G */ do_cmd, COMMAND,
/* ^H */ do_target, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* ^I */ do_badcmd, 0,
/* ^J */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* ^K */ do_badcmd, 0,
/* ^L */ do_cmd, COMMAND,
/* ^M */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* ^N */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* ^O */ do_cmd, COMMAND,
/* ^P */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* ^Q */ do_badcmd, 0,
/* ^R */ do_cmd, COMMAND,
/* ^S */ do_badcmd, 0,
/* ^T */ do_cmd, COMMAND,
/* ^U */ do_scroll, COMMAND,
/* ^V */ do_badcmd, 0,
/* ^W */ do_cmd, COMMAND,
/* ^X */ do_badcmd, 0,
/* ^Y */ do_scroll, COMMAND,
/* ^Z */ do_cmd, COMMAND,
/* ESCAPE */ do_cmd, COMMAND,
/* ^\ */ do_badcmd, 0,
/* ^] */ do_cmd, COMMAND,
/* ^^ */ do_cmd, COMMAND,
/* ^_ */ do_rchar, COMMAND,
/* space */ do_target, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* ! */ do_cmd, COMMAND,
/* " */ do_cmd, COMMAND | TWO_CHAR,
/* # */ do_badcmd, 0,
/* $ */ do_target, COMMAND | TARGET | TGT_CHAR | TGT_INCLUSIVE,
/* % */ do_target, COMMAND | TARGET | TGT_CHAR | TGT_INCLUSIVE,
/* & */ do_cmd, COMMAND,
/* ' */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE | TWO_CHAR,
/* ( */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* ) */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* * */ do_badcmd, 0,
/* + */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* , */ do_csearch, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* - */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* . */ do_cmd, COMMAND,
/* / */ do_cmd, COMMAND,
/* 0 */ do_target, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* 1 */ do_badcmd, 0,
/* 2 */ do_badcmd, 0,
/* 3 */ do_badcmd, 0,
/* 4 */ do_badcmd, 0,
/* 5 */ do_badcmd, 0,
/* 6 */ do_badcmd, 0,
/* 7 */ do_badcmd, 0,
/* 8 */ do_badcmd, 0,
/* 9 */ do_badcmd, 0,
/* : */ do_cmd, COMMAND,
/* ; */ do_csearch, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* < */ do_cmd, COMMAND,
/* = */ do_badcmd, 0,
/* > */ do_cmd, COMMAND,
/* ? */ do_cmd, COMMAND,
/* @ */ do_cmd, COMMAND | TWO_CHAR,
/* A */ do_ins, COMMAND,
/* B */ do_word, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* C */ do_cmd, COMMAND,
/* D */ do_cmd, COMMAND,
/* E */ do_word, COMMAND | TARGET | TGT_CHAR | TGT_INCLUSIVE,
/* F */ do_csearch, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE | TWO_CHAR,
/* G */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* H */ do_HLM, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* I */ do_ins, COMMAND,
/* J */ do_cmd, COMMAND,
/* K */ do_badcmd, 0,
/* L */ do_HLM, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* M */ do_HLM, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* N */ do_target, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* O */ do_ins, COMMAND,
/* P */ do_cmd, COMMAND,
/* Q */ do_badcmd, 0,
/* R */ do_cmd, COMMAND,
/* S */ do_cmd, COMMAND,
/* T */ do_csearch, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE | TWO_CHAR,
/* U */ do_badcmd, 0,
/* V */ do_badcmd, 0,
/* W */ do_word, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* X */ do_x, COMMAND,
/* Y */ do_cmd, COMMAND,
/* Z */ do_cmd, COMMAND | TWO_CHAR,
/* [ */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE | TWO_CHAR,
/* \ */ do_badcmd, 0,
/* ] */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE | TWO_CHAR,
/* ^ */ do_target, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* _ */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* ` */ do_target, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE | TWO_CHAR,
/* a */ do_ins, COMMAND,
/* b */ do_word, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* c */ do_cmd, COMMAND,
/* d */ do_cmd, COMMAND,
/* e */ do_word, COMMAND | TARGET | TGT_CHAR | TGT_INCLUSIVE,
/* f */ do_csearch, COMMAND | TARGET | TGT_CHAR | TGT_INCLUSIVE | TWO_CHAR,
/* g */ do_cmd, COMMAND,
/* h */ do_target, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* i */ do_ins, COMMAND,
/* j */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* k */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* l */ do_target, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* m */ do_cmd, COMMAND | TWO_CHAR,
/* n */ do_target, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* o */ do_ins, COMMAND,
/* p */ do_cmd, COMMAND,
/* q */ do_badcmd, 0,
/* r */ do_cmd, COMMAND,
/* s */ do_cmd, COMMAND,
/* t */ do_csearch, COMMAND | TARGET | TGT_CHAR | TGT_INCLUSIVE | TWO_CHAR,
/* u */ do_cmd, COMMAND,
/* v */ do_badcmd, 0,
/* w */ do_word, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* x */ do_x, COMMAND,
/* y */ do_cmd, COMMAND,
/* z */ do_z, COMMAND | TWO_CHAR,
/* { */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* | */ do_target, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* } */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* ~ */ do_rchar, COMMAND,
/* DEL */ do_badcmd, 0,
/* K_HELP */ do_cmd, COMMAND,
/* K_UNDO */ do_cmd, COMMAND,
/* K_INSERT */ do_ins, COMMAND,
/* K_HOME */ do_HLM, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* K_UARROW */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* K_DARROW */ do_target, COMMAND | TARGET | TGT_LINE | TGT_EXCLUSIVE,
/* K_LARROW */ do_target, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* K_RARROW */ do_target, COMMAND | TARGET | TGT_CHAR | TGT_EXCLUSIVE,
/* K_CGRAVE */ do_cmd, COMMAND,
};
#define NOP '\0' /* no pending o